package com.openspring.framework.dao;

import java.io.Serializable;
import java.util.List;

/**
 * 泛型DAO接口
 * @author HeBin
 *
 * @param <T> 实体
 * @param <ID> 主键
 */
public interface GenericDAO<T, ID extends Serializable> {

	/**
	 * 新增实体
	 * @param entity 实体
	 * @return 新增行数
	 */
	int insert(T entity);
	
	/**
	 * 批量新增实体
	 * @param entities 实体数组
	 * @return 新增行数的数组
	 */
	int[] batchInsert(T[] entities);
	
	/**
	 * 删除实体
	 * @param id 主键
	 * @return 删除行数
	 */
	int delete(ID id);
	
	/**
	 * 批量删除实体
	 * @param ids 主键数组
	 * @return 删除行数的数组
	 */
	int[] batchDelete(ID[] ids);
	
	/**
	 * 更新实体
	 * @param entity 实体
	 * @return 更新行数
	 */
	int update(T entity);
	
	/**
	 * 批量更新实体
	 * @param entities 实体数组
	 * @return 更新行数的数组
	 */
	int[] batchUpdate(T[] entities);
	
	/**
	 * 加载实体, 没有数据则返回null
	 * @param id 主键
	 * @return 实体
	 */
	T load(ID id);
	
	/**
	 * 以默认SQL查询全部实体
	 * @return 实体集合
	 */
	List<T> queryAll();
	
	/**
	 * 以自定义SQL查询
	 * @param whereSql where语句
	 * @param values 值
	 * @return
	 */
	List<T> query(String sql, Object... values);
	
	/**
	 * 以默认SQL和Where语句条件查询实体
	 * @param whereSql where语句
	 * @param values 值
	 * @return
	 */
	List<T> queryWhere(String whereSql, Object... values);
	
	/**
	 * 查询实体记录数
	 * @return 记录数
	 */
	int getTotalCount();
	
	/**
	 * 查询实体记录数
	 * @param whereSql 条件语句
	 * @param values 值
	 * @return 记录数
	 */
	int getTotalCount(String whereSql, Object... values);
	
	/**
	 * 根据ID查询数据是否存在
	 * @param id
	 * @return
	 */
	boolean isExist(ID id);
	
	/**
	 * 根据条件查询数据是否存在
	 * @param whereSql
	 * @param values
	 * @return
	 */
	boolean isExist(String whereSql, Object... values);
}
